#include <stdio.h>
#include <stdlib.h>

/**
 * 动态内存分配
 * 动态二维数组示例，使用指针的指针（二级指针）
 */

int main()
{
  int rows = 3;
  int cols = 3;

  // 动态分配一个指针的指针（二级指针），存储每一行的地址
  int **array = (int **)malloc(rows * sizeof(int *));
  if (array == NULL)
  {
    printf("内存分配失败！\n");
    return 1;
  }

  // 为每一行分配内存，存储列元素
  for (int i = 0; i < rows; i++)
  {
    array[i] = (int *)malloc(cols * sizeof(int));
    if (array[i] == NULL)
    {
      printf("内存分配失败！\n");
      // 释放已分配的内存，防止内存泄漏
      for (int j = 0; j < i; j++)
      {
        free(array[j]);
      }
      free(array);
      return 1;
    }
  }

  // 初始化二维数组
  for (int i = 0; i < rows; i++)
  {
    for (int j = 0; j < cols; j++)
    {
      array[i][j] = i * cols + j;
      printf("%d ", array[i][j]);
    }
    printf("\n");
  }

  // 释放内存
  for (int i = 0; i < rows; i++)
  {
    free(array[i]);
  }
  free(array);

  return 0;
}